/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistencia.Oracle;

import Persistencia.Entidades.Exportador;
import Persistencia.IExportadorDAO;
import Persistencia.Exception.NoNuloException;
import Persistencia.Exception.UnicoException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import oracle.jdbc.OraclePreparedStatement;
import oracle.jdbc.OracleTypes;

/**
 *
 * @author Administrador
 */
public class ExportadorOracleDAO implements IExportadorDAO {

    private static ExportadorOracleDAO INSTANCE = null;

    /*
     * El contrustcor private no permite que se genere un constructor por defecto
     */
    private ExportadorOracleDAO() {
    }

    private synchronized static void createInstance() {
        if (INSTANCE == null) {
            INSTANCE = new ExportadorOracleDAO();
        }
    }

    public static ExportadorOracleDAO getInstance() {
        if (INSTANCE == null) {
            createInstance();
        }
        return INSTANCE;
    }

    public Integer insertExportador(Exportador expo) throws NoNuloException, UnicoException {
        String sql = "INSERT INTO EXPORTADOR"
                + "(RAZON_SOCIAL,DIRECCION,LOCALIDAD,PROVINCIA,PAIS,"
                + "ABREVIADO,CUIT) VALUES(?,?,?,?,?,?,?) RETURNING ID_EXPORTADOR INTO ?";
        try {
            OraclePreparedStatement pst = (OraclePreparedStatement) OracleDAOFactory.getConnection().prepareStatement(sql);
            pst.setString(1, expo.getRazonSocial());
            pst.setString(2, expo.getDireccion());
            pst.setString(3, expo.getLocalidad());
            pst.setString(4, expo.getProvincia());
            pst.setString(5, expo.getPais());
            pst.setString(6, expo.getAbreviado());
            pst.setInt(7, expo.getCuit().intValue());
            pst.registerReturnParameter(8, OracleTypes.NUMBER);
            pst.executeUpdate();

            ResultSet rs = pst.getReturnResultSet();
            if (rs.next()) {
                return rs.getInt(1);
            }
            return null;

        } catch (SQLException ex) {
            switch (ex.getErrorCode()) {
                case 1400:
                    throw new NoNuloException(ex.getMessage());
                case 1:
                    throw new UnicoException(ex.getMessage());
            }

            return null;
        }
    }

    public boolean deleteExportador(Exportador expo) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public Exportador getExportador(Integer idExportador) {
        String sql = "SELECT * FROM EXPORTADOR  WHERE ID_EXPORTADOR = ?";
        try {
            OraclePreparedStatement pst = (OraclePreparedStatement) OracleDAOFactory.getConnection().prepareStatement(sql);
            pst.setInt(1, idExportador.intValue());
            ResultSet rs = pst.executeQuery();
            if (rs.next()) {
                Exportador expo = new Exportador();
                expo.setIdExportador(rs.getShort("ID_EXPORTADOR"));
                expo.setRazonSocial(rs.getString("RAZON_SOCIAL"));
                expo.setDireccion(rs.getString("DIRECCION"));
                expo.setLocalidad(rs.getString("LOCALIDAD"));
                expo.setProvincia(rs.getString("PROVINCIA"));
                expo.setPais(rs.getString("PAIS"));
                expo.setAbreviado(rs.getString("ABREVIADO"));
                expo.setCuit(rs.getLong("CUIT"));

                return expo;
            } else {
                return null;
            }
        } catch (SQLException ex) {



            ex.printStackTrace();
            return null;
        }


    }

    public Exportador getExportador(String RazonSocial) {
        String sql = "SELECT * FROM EXPORTADOR  WHERE RAZON_SOCIAL = ?";
        try {
            OraclePreparedStatement pst = (OraclePreparedStatement) OracleDAOFactory.getConnection().prepareStatement(sql);
            pst.setString(1, RazonSocial);
            ResultSet rs = pst.executeQuery();
            if (rs.next()) {
                Exportador expo = new Exportador();
                expo.setIdExportador(rs.getShort("ID_EXPORTADOR"));
                expo.setRazonSocial(rs.getString("RAZON_SOCIAL"));
                expo.setDireccion(rs.getString("DIRECCION"));
                expo.setLocalidad(rs.getString("LOCALIDAD"));
                expo.setProvincia(rs.getString("PROVINCIA"));
                expo.setPais(rs.getString("PAIS"));
                expo.setAbreviado(rs.getString("ABREVIADO"));
                expo.setCuit(rs.getLong("CUIT"));

                return expo;
            } else {
                return null;
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
            return null;
        }
    }

    public List<Exportador> getAllExportadores() {
        String sql = "SELECT * FROM EXPORTADOR";
        try {
            OraclePreparedStatement pst = (OraclePreparedStatement) OracleDAOFactory.getConnection().prepareStatement(sql);
            ResultSet rs = pst.executeQuery();
            List<Exportador> lExpo = new ArrayList();
            while (rs.next()) {
                Exportador expo = new Exportador();
                expo.setIdExportador(rs.getShort("ID_EXPORTADOR"));
                expo.setRazonSocial(rs.getString("RAZON_SOCIAL"));
                expo.setDireccion(rs.getString("DIRECCION"));
                expo.setLocalidad(rs.getString("LOCALIDAD"));
                expo.setProvincia(rs.getString("PROVINCIA"));
                expo.setPais(rs.getString("PAIS"));
                expo.setAbreviado(rs.getString("ABREVIADO"));
                expo.setCuit(rs.getLong("CUIT"));
                lExpo.add(expo);

            }
            return lExpo;
        } catch (SQLException ex) {
            ex.printStackTrace();
            return null;
        }
    }

    public List<Exportador> selectExportadores(String condicion) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public boolean updateExportador(Exportador expo) {

        String sql = "UPDATE EXPORTADOR SET RAZON_SOCIAL = ?,"
                + "DIRECCION = ?,LOCALIDAD=?,PROVINCIA=?,PAIS=?,"
                + "ABREVIADO = ?,CUIT = ? WHERE ID_EXPORTADOR = ?";
        try {
            OraclePreparedStatement pst = (OraclePreparedStatement) OracleDAOFactory.getConnection().prepareStatement(sql);
            pst.setString(1, expo.getRazonSocial());
            pst.setString(2, expo.getDireccion());
            pst.setString(3, expo.getLocalidad());
            pst.setString(4, expo.getProvincia());
            pst.setString(5, expo.getPais());
            pst.setString(6, expo.getAbreviado());
            pst.setInt(7, expo.getCuit().intValue());
            pst.setInt(8, expo.getIdExportador());
            return pst.execute();
        } catch (SQLException ex) {
            ex.printStackTrace();
            return false;
        }

    }
}
